package fr.afcepf.al23.qualite.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import fr.afcepf.al23.qualite.entity.Utilisateur;
/**
 * Implementation de l'interface IDaoUtilisateur.
 * @author Stagiaire
 */
public class DaoUtilisateurImpl implements IDaoUtilisateur {
    /**
     * variable représentant la datasource à la base al23_qualite.
     */
    private DataSource ds = new QualiteDataSource();
    /**
     * indice du paramètre 'mail' dans la requete
     * {@link DaoUtilisateur#reqConnection}.
     */
    private final int indiceParamMailReqConnect = 1;
    /**
     * indice du paramètre 'mdp' dans la requete
     * {@link DaoUtilisateur#reqConnection}.
     */
    private final int indiceParamMdpReqConnect = 2;
    /**
     * indice du paramètre 'id' dans la requete
     * {@link DaoUtilisateur#reqEnregistrer}.
     */
    private final int indiceParamIdReqEnregistrer = 1;
    /**
     * indice du paramètre 'nom' dans la requete
     * {@link DaoUtilisateur#reqEnregistrer}.
     */
    private final int indiceParamNomReqEnregistrer = 2;
    /**
     * indice du paramètre 'mail' dans la requete
     * {@link DaoUtilisateur#reqEnregistrer}.
     */
    private final int indiceParamMailReqEnregistrer = 3;
    /**
     * indice du paramètre 'mdp' dans la requete
     * {@link DaoUtilisateur#reqEnregistrer}.
     */
    private final int indiceParamMdpReqEnregistrer = 4;
    /**
     * indice du paramètre 'adresse' dans la requete
     * {@link DaoUtilisateur#reqEnregistrer}.
     */
    private final int indiceParamAdresseReqEnregistrer = 5;
    /**
     * indice du paramètre 'mail' dans la requete
     * {@link DaoUtilisateur#reqVerifMail}.
     */
    private final int indiceParamMailReqVerifMail = 1;
    /**
     * nom de la colonne 'id' de la table 'utilisateur'.
     */
    private final String colonneId = "id";
    /**
     * nom de la colonne 'nom' de la table 'utilisateur'.
     */
    private final String colonneNom = "nom";
    /**
     * nom de la colonne 'mail' de la table 'utilisateur'.
     */
    private final String colonneMail = "mail";
    /**
     * nom de la colonne 'mdp' de la table 'utilisateur'.
     */
    private final String colonneMdp = "mdp";
    /**
     * nom de la colonne 'adresse' de la table 'utilisateur'.
     */
    private final String colonneAdresse = "adresse";
    /**
     * chaine SQL pour r�cuperer une liste d'utilisateurs existants.
     */
    private final String reqConnection = "SELECT * FROM utilisateur WHERE "
            + "mail = ? AND mdp= ?";
    /**
     * chaine SQL pour ins�rer un nouvel utilisateur.<br />
     * Liste des param�tres:
     *  <ul>
     *      <li>indice 1: id</li>
     *      <li>indice 2:nom</li>
     *      <li>indice 3:mail</li>
     *      <li>indice 4:mdp</li>
     *      <li>indice 5:adresse</li>
     *  </ul>
     */
    private final String reqEnregistrer = "INSERT INTO utilisateur (id, nom, mail, mdp, adresse) "
            + "VALUES (?,?,?,?,?)";
    /**
     * chaine SQL pour récupérer un utilisateur par son mail.
     */
    private final String reqVerifMail = "SELECT * FROM utilisateur WHERE "
            + "mail = ? ";
    @Override
    public Utilisateur seConnecter(String paramMail, String paramMdp) {
        Utilisateur user = null;
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqConnection);
            pstmt.setString(indiceParamMailReqConnect, paramMail);
            pstmt.setString(indiceParamMdpReqConnect, paramMdp);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                user = rsToUtilisateur(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return user;
    }
    /**
     * Methode pour convertir un ResultSet en objet de type {@link Utilisateur}.
     * @param paramRs le resultset ouvert a un enregistrement
     * @return l'objet {@link Utilisateur}
     * @throws SQLException si une erreur lors de la lecture de l'enregistrement.
     */
    private Utilisateur rsToUtilisateur(ResultSet paramRs) throws SQLException {
        Utilisateur user = new Utilisateur(
                paramRs.getInt(colonneId),
                paramRs.getString(colonneNom),
                paramRs.getString(colonneMail),
                paramRs.getString(colonneMdp),
                paramRs.getString(colonneAdresse));
        return user;
    }
    @Override
    public Utilisateur enregistrer(Utilisateur paramUtil) {
        Utilisateur user = new Utilisateur();
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqEnregistrer);
            pstmt.setInt(indiceParamIdReqEnregistrer, paramUtil.getId());
            pstmt.setString(indiceParamNomReqEnregistrer, paramUtil.getName());
            pstmt.setString(indiceParamMailReqEnregistrer, paramUtil.getMail());
            pstmt.setString(indiceParamMdpReqEnregistrer, paramUtil.getMdp());
            pstmt.setString(indiceParamAdresseReqEnregistrer, paramUtil.getAdresse());
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                user = rsToUtilisateur(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return user;
    }
    @Override
    public boolean verifMail(String paramMail) {
        Utilisateur user = new Utilisateur();
        Connection cnx = null;
        Boolean result = true;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqVerifMail);
            pstmt.setString(indiceParamMailReqVerifMail, paramMail);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                user = rsToUtilisateur(rs);
            }
            if (user.getId() == null) {
                result = false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    /**
     * Default constructor.
     */
    public DaoUtilisateurImpl() {
        super();
    }
}
